package br.edu.ufcg.unknown.semantico;

import br.edu.ufcg.unknown.lexico.Token;
import br.edu.ufcg.unknown.sintatico.IdentificaTK;

public class Tipo {
	
	
	private String tipo;
	private boolean ehArray;
	private Token token;
	private int precedencia;
	private static final IdentificaTK ident = new IdentificaTK();
	
	public Tipo(Token tk){
		this(tk, false);
	}
	
	public Tipo(Token tk,boolean array){
		setTipo(tk);
		this.ehArray = array;
		this.token = tk;
	}
	
	public String getTipo(){
		return this.tipo;
	}
	
	public boolean ehArray(){
		return this.ehArray;
	}
	
	private void setTipo(Token tk) {
		if (tk.ehPalavraReservada()) {
			this.tipo = tk.getLexema();
		} else {
			if (ident.eh_ALFA(tk)) {
				this.tipo = "STRING";
			} else if (ident.eh_NUM(tk)) {
				this.tipo = "INTEGER";
			} else if (ident.eh_TRUE(tk) || ident.eh_FALSE(tk)) {
				this.tipo = "BOOLEAN";
			}
		}
	}
	
	private void setPrecedencia(Token tk){
		this.precedencia = 0;
		if(tk.ehOperadorDivisao() || tk.ehOperadorMultiplicacao()){
			precedencia++;
		} else if(tk.ehPalavraReservada()){
			precedencia += 2;
		}
	}

	public void setEhArray(boolean array) {
		this.ehArray = array;
		
	}
	
	public Token getToken() {
		return token;
	}

	public boolean equals(Tipo newTipo){
		if(this.tipo != null && newTipo.tipo != null){
			if(!this.tipo.equals(newTipo.tipo)){
				return false;
			}
		} else if(this.tipo != null || newTipo.tipo != null){
			return false;
		}
		
		if(this.token != null && newTipo.token != null){
			if(!this.token.equals(newTipo.token)){
				return false;
			}
		} else if(this.token != null || newTipo.token != null){
			return false;
		}
		
		return this.ehArray == newTipo.ehArray;
	}

	public boolean ehInteger() {
		if(this.tipo == null){
			return false;
		}
		return this.tipo.equals("INTEGER");
	}
	
	public boolean ehCadeia() {
		if(this.tipo == null){
			return false;
		}
		return this.tipo.equals("STRING");
	}
	
	public boolean ehBoolean() {
		if(this.tipo == null){
			return false;
		}
		return this.tipo.equals("BOOLEAN");
	}

	public int getPrecedencia() {
		return precedencia;
	}

}
